package com.probox.common.entity.service.product.impl;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import java.util.Arrays;
import java.util.List;

import com.probox.common.core.constant.CachePrefix;
import com.probox.common.core.enums.DataStatus;
import com.probox.common.core.exception.ProductException;
import com.probox.common.core.utils.SecurityUtils;
import com.probox.common.redis.service.RedisService;
import com.probox.common.entity.domain.product.vo.ProductGroupListVo;
import com.probox.common.entity.domain.product.vo.ProductInfoQuery;
import com.probox.common.entity.domain.product.vo.ProductInfoTagsVo;
import com.probox.common.entity.domain.product.vo.ProductSaveVo;
import com.probox.common.entity.service.product.IProductInfoTagsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.probox.common.entity.mapper.product.ProductInfoTagsMapper;
import com.probox.common.entity.domain.product.ProductInfoTags;
import org.springframework.transaction.annotation.Transactional;

/**
 * 标签中间信息Service业务层处理
 *
 *
 * @date 2021-05-28
 */
@Service
@Transactional
public class ProductInfoTagsServiceImpl extends ServiceImpl<ProductInfoTagsMapper, ProductInfoTags> implements IProductInfoTagsService {
    @Autowired
    private ProductInfoTagsMapper productInfoTagsMapper;

    @Autowired
    private RedisService redisService;

    /**
     * 查询标签中间信息
     *
     * @param productUid 商品uid
     * @return 标签中间信息
     */
    @Override
    public Long [] selectProductInfoTagsArray(Long productUid)
    {
        Long [] tagsUid = null;
        List<ProductInfoTags> productInfoTags = queryList(productUid);
        if(ObjectUtil.isNotEmpty(productInfoTags)){
            int size = productInfoTags.size();
            tagsUid = new Long[size];
            Integer index = 0;
            for(ProductInfoTags tags : productInfoTags){
                tagsUid[index] = tags.getTagsUid();
                index++;
            }
        }
        return tagsUid;
    }

    /**
     * 查询标签中间信息列表
     *
     * @param productUid 商品uid
     * @return 标签中间信息
     */
    @Override
    public List<ProductInfoTags> queryList(Long productUid) {
        QueryWrapper<ProductInfoTags> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("PRODUCT_UID",productUid);
        queryWrapper.eq("DATA_STATUS",DataStatus.valid.getKey());
        return productInfoTagsMapper.selectList(queryWrapper);
    }

    /**
     * 新增标签中间信息
     *
     * @param productSaveVo 商品信息vo
     * @return 结果
     */
    @Override
    public void insertProductInfoTags(ProductSaveVo productSaveVo) {
        Long productUid = productSaveVo.getProductUid();
        Long platformUid = productSaveVo.getPlatformUid();
        Long[] tagsUid = productSaveVo.getTagsUid();
        // 添加标签
        if (ObjectUtil.isNotNull(tagsUid)) {
            Arrays.stream(tagsUid).forEach(tags -> saveInfoTags(productUid, platformUid, tags));
        }
    }


    /**
     * 修改标签中间信息
     *
     * @param productSaveVo 商品信息vo
     * @return 结果
     */
    @Override
    public void updateProductInfoTags(ProductSaveVo productSaveVo) {
        UpdateWrapper<ProductInfoTags> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("PRODUCT_UID", productSaveVo.getProductUid());
        updateWrapper.set("DATA_STATUS", DataStatus.delete.getKey());
        this.update(updateWrapper);
        // save
        insertProductInfoTags(productSaveVo);
    }

    /**
     *  添加标签中间值
      * @param productUid
     * @param platformUid
     * @param tags
     */
    private void saveInfoTags(Long productUid, Long platformUid,Long tags){
        ProductInfoTags productInfoTags = new ProductInfoTags();
        productInfoTags.setPlatformUid(platformUid);
        productInfoTags.setProductUid(productUid);
        productInfoTags.setTagsUid(tags);
        productInfoTags.setDataStatus(DataStatus.valid.getKey());
        boolean tagsInfo = this.save(productInfoTags);
        if (!tagsInfo) throw new ProductException("添加失败,请重新添加!");
    }


    /**
     *  清除s标签ku
     * @param productUids 商品uid集合
     */
    @Override
    public void updateInfoTagStatus(Long [] productUids){
        UpdateWrapper<ProductInfoTags> updateWrapper = new UpdateWrapper<>();
        updateWrapper.set("DATA_STATUS", DataStatus.delete.getKey());
        updateWrapper.in("PRODUCT_UID", productUids);
        this.update(updateWrapper);
    }

    /**
     *  查询猜你喜欢的商品uid
     * @param platformUid
     * @return
     */
    @Override
    public List<Long> productLike(Long platformUid){
        return productInfoTagsMapper.productLike(platformUid);
    }

    /**
     * 根据标签id获取商品uid
     * @param query
     * @return
     */
    @Override
    public List<Long> getProductTags(ProductInfoQuery query){
        return productInfoTagsMapper.getProductTags(query);
    }

    /**
     * 获取标签相关的商品信息
     * @param tagsUid
     * @return
     */
    @Override
    public List<ProductGroupListVo> geTagsList(Long tagsUid){
        return productInfoTagsMapper.queryTagsProductList(tagsUid);
    }

    /**
     * 添加中间关系
     * @param vo
     */
    @Override
    public void updateTagsList(ProductInfoTagsVo vo){
        if(ObjectUtil.isEmpty(vo)) throw  new ProductException("参数不正确！");
        Long tagsUid = vo.getTagsUid();
        if(ObjectUtil.isEmpty(tagsUid)) throw  new ProductException("参数不正确！");
        Long platformId = SecurityUtils.getPlatformId();
        UpdateWrapper<ProductInfoTags> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("TAGS_UID",tagsUid);
        updateWrapper.eq("DATA_STATUS", DataStatus.valid.getKey());
        updateWrapper.set("DATA_STATUS", DataStatus.delete.getKey());
        this.update(updateWrapper);
        List<Long> list = vo.getList();
        list.forEach(uid -> {
            saveInfoTags(uid,platformId,tagsUid);
            redisService.deleteObject(CachePrefix.API_PRODUCT_DETAIL + uid);
            redisService.deleteObject(CachePrefix.TEMPLATE_PRODUCT + uid);
        });
    }

}
